package com.hmdp.utils;

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

/**
 * @author Ccoo
 * 2023/12/3
 */
@Component
public class RedisIdWorker {

	/** 开始时间截 (2022-01-01) */
	private static final long BEGIN_TIMESTAMP = 1640995200L;

	/** 序列号位数 */
	private static final int COUNT_BITS = 32;

	private StringRedisTemplate stringRedisTemplate;

	public RedisIdWorker(StringRedisTemplate stringRedisTemplate) {
		this.stringRedisTemplate = stringRedisTemplate;
	}

	public long nextId(String keyPrefix){
		// 1. 生成时间戳
		LocalDateTime now = LocalDateTime.now();
		long nowSecond = now.toEpochSecond(ZoneOffset.UTC); // 当前秒数
		long timeStamp = nowSecond - BEGIN_TIMESTAMP; // 时间戳
		// 2. 生成序列号
		// 2.1 获取当前日期 ( 精确到天 )
		String date = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
		// 2.2 自增长
		long count = stringRedisTemplate.opsForValue().increment("icr:" + keyPrefix + ":" + date);
		// 3. 拼接并返回
		return timeStamp << COUNT_BITS | count;
	}
}
